#ifndef __BEEP_H
#define __BEEP_H

#include "./SYSTEM/sys/sys.h"

/* -------------------------------------------- 蜂鸣器类型配置 -------------------------------------------- */

#define USE_ACTIVE_BEEP    0            /* 1:使用有源蜂鸣器  0:使用无源蜂鸣器 */

/* -------------------------------------------- 蜂鸣器引脚定义 -------------------------------------------- */

#define BEEP_GPIO_PORT                  GPIOD
#define BEEP_GPIO_PIN                   GPIO_PIN_15
#define BEEP_GPIO_CLK_ENABLE()          do{ __HAL_RCC_GPIOD_CLK_ENABLE(); }while(0)         /* PD口时钟使能 */

#if !USE_ACTIVE_BEEP
/* -------------------------------------------- 无源蜂鸣器PWM定义 -------------------------------------------- */

/* 无源蜂鸣器PWM - TIM4_CH4 */
#define BEEP_GPIO_AFTIMX                GPIO_AF2_TIM4

/* TIM4定时器 */
#define BEEP_TIMX                       TIM4
#define BEEP_TIMX_CLK_ENABLE()          do{ __HAL_RCC_TIM4_CLK_ENABLE(); }while(0)

/* 通道定义 */
#define BEEP_TIMX_CHY                   TIM_CHANNEL_4

#endif

/* -------------------------------------------- 蜂鸣器控制宏定义 ------------------------------------------ */

#if USE_ACTIVE_BEEP
/* 有源蜂鸣器控制宏 */
#define BEEP(x)         do{ x ? \
                            HAL_GPIO_WritePin(BEEP_GPIO_PORT, BEEP_GPIO_PIN, GPIO_PIN_SET) : \
                            HAL_GPIO_WritePin(BEEP_GPIO_PORT, BEEP_GPIO_PIN, GPIO_PIN_RESET); \
                        }while(0)                                                           /* 蜂鸣器开关控制 */

#define BEEP_TOGGLE()   do{ HAL_GPIO_TogglePin(BEEP_GPIO_PORT, BEEP_GPIO_PIN); }while(0)    /* 蜂鸣器状态翻转 */

#else
/* 无源蜂鸣器控制宏 */
#define BEEP(x)         do{ if(x) { beep_start(); } else { beep_stop(); } }while(0)         /* 蜂鸣器开关控制 */
#define BEEP_TOGGLE()   do{ beep_toggle(); }while(0)                                        /* 蜂鸣器状态翻转 */

#endif

/* ------------------------------------------------ 函数声明 ---------------------------------------------- */

void beep_init(void);                                       /* 初始化蜂鸣器 */

#if !USE_ACTIVE_BEEP
/* 无源蜂鸣器专用函数 */
void beep_pwm_init(uint32_t freq, uint8_t volume);          /* 初始化PWM定时器 */
void beep_start(void);                                      /* 启动蜂鸣器 */
void beep_stop(void);                                       /* 停止蜂鸣器 */
void beep_toggle(void);                                     /* 切换蜂鸣器状态 */
void beep_set_frequency(uint32_t freq);                     /* 设置蜂鸣器频率 */
void beep_set_volume(uint8_t volume);                       /* 设置蜂鸣器音量(0-100)，音量>0时自动启动，音量=0时自动关闭 */

/* 全局变量声明 */
extern TIM_HandleTypeDef g_beep_tim_handler;                /* 蜂鸣器定时器句柄 */
extern TIM_OC_InitTypeDef g_beep_tim_oc_handler;            /* 蜂鸣器定时器通道句柄 */
extern uint8_t g_beep_volume;                               /* 蜂鸣器音量 */
extern uint32_t g_beep_frequency;                           /* 蜂鸣器频率 */
extern uint8_t g_beep_status;                               /* 蜂鸣器状态 */

#endif

#endif
